home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / sum.c < prev    next >
C/C++ Source or Header  |  1990-07-15  |  2KB  |  113 lines

  1. /* sum - checksum a file        Author: Martin C. Atkins */
  2.  
  3. /*
  4.  *    This program was written by:
  5.  *        Martin C. Atkins,
  6.  *        University of York,
  7.  *        Heslington,
  8.  *        York. Y01 5DD
  9.  *        England
  10.  *    and is released into the public domain, on the condition
  11.  *    that this comment is always included without alteration.
  12.  */
  13.  
  14. #include <sys/types.h>
  15. #include <fcntl.h>
  16.  
  17. #define BUFSIZ (512)
  18.  
  19. int rc = 0;
  20.  
  21. char *defargv[] = {"-", 0};
  22.  
  23. main(argc, argv)
  24. int argc;
  25. char *argv[];
  26. {
  27.   register int fd;
  28.  
  29.   if (*++argv == 0) argv = defargv;
  30.   for (; *argv; argv++) {
  31.     if (argv[0][0] == '-' && argv[0][1] == '\0')
  32.         fd = 0;
  33.     else
  34.         fd = open(*argv, O_RDONLY);
  35.  
  36.     if (fd == -1) {
  37.         error("can't open ", *argv);
  38.         rc = 1;
  39.         continue;
  40.     }
  41.     sum(fd, (argc > 2) ? *argv : (char *) 0);
  42.     if (fd != 0) close(fd);
  43.   }
  44.   exit(rc);
  45. }
  46.  
  47. error(s, f)
  48. char *s, *f;
  49. {
  50.  
  51.   std_err("sum: ");
  52.   std_err(s);
  53.  
  54.   if (f) std_err(f);
  55.   std_err("\n");
  56. }
  57.  
  58. sum(fd, fname)
  59. int fd;
  60. char *fname;
  61. {
  62.   char buf[BUFSIZ];
  63.   register int i, n;
  64.   long size = 0;
  65.   unsigned crc = 0;
  66.   unsigned tmp, blks;
  67.  
  68.   while ((n = read(fd, buf, BUFSIZ)) > 0) {
  69.     for (i = 0; i < n; i++) {
  70.         crc = (crc >> 1) + ((crc & 1) ? 0x8000 : 0);
  71.         tmp = buf[i] & 0377;
  72.         crc += tmp;
  73.         crc &= 0xffff;
  74.         size++;
  75.     }
  76.   }
  77.  
  78.   if (n < 0) {
  79.     if (fname)
  80.         error("read error on ", fname);
  81.     else
  82.         error("read error", (char *) 0);
  83.     rc = 1;
  84.     return;
  85.   }
  86.   putd(crc, 5, 1);
  87.   blks = (size + (long) BUFSIZ - 1L) / (long) BUFSIZ;
  88.   putd(blks, 6, 0);
  89.   if (fname) prints(" %s", fname);
  90.   prints("\n");
  91. }
  92.  
  93. putd(number, fw, zeros)
  94. int number, fw, zeros;
  95. {
  96. /* Put a decimal number, in a field width, to stdout. */
  97.  
  98.   char buf[10];
  99.   int n;
  100.   unsigned num;
  101.  
  102.   num = (unsigned) number;
  103.   for (n = 0; n < fw; n++) {
  104.     if (num || n == 0) {
  105.         buf[fw - n - 1] = '0' + num % 10;
  106.         num /= 10;
  107.     } else
  108.         buf[fw - n - 1] = zeros ? '0' : ' ';
  109.   }
  110.   buf[fw] = 0;
  111.   prints("%s", buf);
  112. }
  113.